# coding: utf-8
# File   :  yaml_control
# Author :  wangsheng
# @Time  :  2025/5/7 下午4:54
import yaml
from typing import Dict, Any
from pathlib import Path
from common.setting import ensure_path_sep


class YamlReader:
    """
    YAML 文件安全读取工具
    功能：
    1. 自动检查文件是否存在
    2. 使用安全模式解析YAML（防止恶意代码）
    3. 自动处理文件编码（UTF-8）
    4. 返回标准字典格式数据
    """

    def __init__(self, file_path: str):
        """
        初始化读取器
        :param file_path: YAML文件路径（支持相对/绝对路径）
        """
        self.file_path = Path(file_path).absolute()  # 转换为绝对路径

    def read(self) -> Dict[str, Any]:
        """
        读取YAML文件内容
        :return: 解析后的字典数据
        :raises:
            FileNotFoundError - 文件不存在时抛出
            ValueError - YAML格式错误时抛出
        """
        # 检查文件是否存在
        if not self.file_path.exists():
            raise FileNotFoundError(f"YAML文件不存在: {self.file_path}")

        # 读取并解析文件
        try:
            with open(self.file_path, 'r', encoding='utf-8') as f:
                data = yaml.safe_load(f)  # 使用安全加载模式
                return data if data is not None else {}  # 确保返回字典类型
        except yaml.YAMLError as e:
            raise ValueError(f"YAML解析失败（{self.file_path}）: {e}")
        except UnicodeDecodeError:
            raise ValueError(f"文件编码错误（仅支持UTF-8）: {self.file_path}")


# 使用示例
if __name__ == '__main__':
    try:
        # 实例化读取器
        reader = YamlReader(ensure_path_sep("/common/config.yaml"))

        # 读取YAML内容
        config_data = reader.read()
        print("成功读取YAML内容:")
        print(config_data)

    except FileNotFoundError as e:
        print(f"文件错误: {e}")
    except ValueError as e:
        print(f"内容解析错误: {e}")
